/// 安全转换成 int 类型
///
/// 如果是 null 则返回 0
/// 如果是 bool，则将 ture 转换成 1，false 转换成 0
/// 如果是 int，则正常 cast
/// 如果是 double，则返回整数部分
/// 如果是 String，则尝试转换成 int，如果转换失败，则返回 0
/// 如果是其他类型，则返回 0
int parseToInt(dynamic x) {
  if (x != null) {
    if (x is int) {
      return x;
    } else if (x is bool) {
      return x ? 1 : 0;
    } else if (x is double) {
      return x.toInt();
    } else if (x is String) {
      return double.tryParse(x)?.toInt() ?? 0;
    } else {
      return int.tryParse(x.toString()) ?? 0;
    }
  } else {
    return 0;
  }
}

/// 安全转换成 double 类型 保留两位小数
double parseToMoney(dynamic x) {
  if (x != null) {
    if (x is double) {
      return (x *100).round()/100;
    } else if (x is bool) {
      return x ? 1 : 0;
    } else if (x is int) {
      return x.toDouble();
    } else if (x is String) {
      return parseToMoney(double.tryParse(x) ?? 0);
    } else {
      return parseToMoney(double.tryParse(x.toString()) ?? 0);
    }
  } else {
    return 0;
  }
}

/// 安全转换成 double 类型
///
/// 如果是 null 则返回 0
/// 如果是 bool，则将 ture 转换成 1，false 转换成 0
/// 如果是 int，则返回 double 类型的值
/// 如果是 double，则正常 cast
/// 如果是 String，则尝试转换成 double，如果转换失败，则返回 0
/// 如果是其他类型，则返回 0
double parseToDouble(dynamic x) {
  if (x != null) {
    if (x is double) {
      return x;
    } else if (x is bool) {
      return x ? 1 : 0;
    } else if (x is int) {
      return x.toDouble();
    } else if (x is String) {
      return double.tryParse(x) ?? 0;
    } else {
      return double.tryParse(x.toString()) ?? 0;
    }
  } else {
    return 0;
  }
}

/// 安全转换成 bool 类型
///
/// 如果是 null 则返回 false
/// 如果是 bool，则正常 cast
/// 如果是 int，1 转换成 true，其他转换成 false
bool parseToBool(dynamic x) {
  if (x != null) {
    if (x is bool) {
      return x;
    } else if (x is int) {
      return x == 1;
    } else {
      return false;
    }
  } else {
    return false;
  }
}

/// 安全转换成 String 类型
///
/// 如果是 null 则返回 ''
/// 如果不是 null 则调用 toString 方法
String parseToString(dynamic x) {
  if (x != null) {
    return x.toString();
  } else {
    return '';
  }
}

/// 安全 cast List<dynamic>
List<T> parseToList<T>(List? x) {
  if (x != null && x.isNotEmpty) {
    if (x.first is int ||
        x.first is bool ||
        x.first is double ||
        x.first is String) {
      final list = x.cast<T>();
      return list;
    } else {
      return [];
    }
  } else {
    return [];
  }
}
